#include"UdpServer.hpp"
#include<memory>
#include<cstdio>

void Usage(string proc)
{
    cout<<"\n\rUsage: "<<proc<<" port[1024+]\n"<<endl;
}
//提供两个可选的客户端消息处理函数，供 Run 方法调用：
string Handler(const string&str)
{
    string res="server get a message: ";
    res+=str;
    cout<<res<<endl;
    return res;
}

string ExcuteCommand(const string &cmd)
{//执行系统命令（将客户端消息作为命令），通过 popen 创建管道读取命令输出，
//将输出结果返回给客户端（若命令不存在会返回错误信息）
    FILE*fp=popen(cmd.c_str(),"r");//创建管道并以只读方式打开
    if(nullptr==fp)
    {
        perror("popen");
        return "error";
    }
    string result;
    char buffer[4096];
    while(true)
    {
        char*ok=fgets(buffer,sizeof(buffer),fp);//从管道读取数据到buffer
        if(ok==nullptr) break;
        result+=buffer;
    }
    pclose(fp);
    return result;
}
// ./udpserver port
int main(int argc,char*argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        exit(0);
    }
    uint16_t port=stoi(argv[1]);
    //使用智能指针 unique_ptr 管理 UdpServer 实例，
    //避免手动释放资源的风险：通过 new UdpServer(port) 传入端口号创建实例。
    unique_ptr<UdpServer> svr(new UdpServer(port));
    svr->Init();
    svr->Run(Handler);//启动服务器
    return 0;
}